00:00
Tableau d'affichage virtuel (Format YSC)
Astuce : Sélectionnez n'importe quelle section dans l'éditeur de gauche pour mettre à jour le contenu de sa carte.

Effect of Salinity on Microalgae Growth Rates

Foire régionale des sciences et de la technologie de Quinte

Résumé

Le résumé du projet apparaîtra ici...

1. Pourquoi (Contexte & Question)

Les microalgues jouent un rôle vital dans les écosystèmes aquatiques en tant que producteurs primaires...

2. Comment (Procédure & Méthodes)

Trois cultures distinctes préparées avec des concentrations de NaCl variables...

3. Quoi (Résultats & Données)

Les cultures à 1,5 % de salinité ont présenté une densité maximale de 4,2 x 10^6 cellules/mL...

4. Et alors (Conclusion & Analyse)

Hypothèse soutenue par les données ; une forte salinité crée un déséquilibre osmotique...

Graphique de données interactif (Chart.js)

Mentor de projet IA & Prévision des scores de la grille YSC

Simulez l'évaluation officielle de Sciences jeunesse Canada (SJC) avec des indicateurs de pourcentage en temps réel.

Pensée scientifique 85%
Originalité & Créativité 78%
Communication & Présentation 92%

Suivi du journal de bord numérique & Analyses temporelles

Heures totales : 10,0 h
Date Catégorie Activité Heures Images / Preuves
2026-06-01 Recherche bibliographique Articles de fond examinés sur la salinité. 3.0 Aucune
2026-06-03 Expérimentation Mise en place de chambres de croissance de microalgues. 5.0 Aucune
2026-06-05 Analyse des données Tracé des taux de croissance initiaux. 2.0 Aucune

Collaboration & Code QR de la foire physique

Améliorations d'exportation & de présentation

Exportation du classeur académique - Évaluation de projet YSC

${sectionData.title || "Classeur académique du projet"}

Foire régionale des sciences et de la technologie de Quinte (QRSTF) - Classeur académique d'évaluation officielle pour les juges

1. Résumé et aperçu du projet

${sectionData.abstract || "Résumé en attente..."}

2. Notes de recherche et historique du journal de bord

`; logEntries.forEach(entry => { binderHTML += ``; }); binderHTML += `
Date Catégorie Activité & Notes Heures
${new Date().toISOString().split('T')[0]} ${entry.cat} ${entry.cat === 'Recherche bibliographique' ? 'Articles de fond et sources examinés.' : entry.cat === 'Expérimentation' ? 'Essais menés et points de données enregistrés.' : 'Résultats analysés et tendances vérifiées.'} (${entry.hours}h) ${entry.hours} h

3. Hypothèse & Mises à jour de sections

Pourquoi (Contexte & Question) : ${sectionData.why}

Comment (Procédure & Méthodes) : ${sectionData.how}

Quoi (Résultats & Données) : ${sectionData.what}

Et alors (Conclusion & Analyse) : ${sectionData.sowhat}

4. Bibliographie & Citations

${document.getElementById('citationOutput').value || "Aucune citation générée pour l'instant. Vérifiez le générateur APA/MLA."}

`; const blob = new Blob([binderHTML], { type: 'text/html' }); const url = URL.createObjectURL(blob); const win = window.open(url, '_blank'); if(win) { win.focus(); alert("📚 Classeur académique compilé et ouvert dans un nouvel onglet, prêt pour les juges !"); } else { alert("Fenêtre popup bloquée ! Veuillez autoriser les fenêtres popup pour afficher l'exportation du classeur académique."); } } function generateCitation(style) { const type = document.getElementById("citeType").value; const author = document.getElementById("citeAuthor").value.trim() || "Auteur, A. A."; const title = document.getElementById("citeTitle").value.trim() || "Source sans titre"; const source = document.getElementById("citeSource").value.trim() || "https://example.com"; let citation = ""; if (style === 'APA') { citation = `${author} (${title}). *${title}*. Récupéré de ${source}`; } else { citation = `${author}. "${title}." *${source}*, ${title}.`; } document.getElementById("citationOutput").value = citation; } function triggerDictation() { if (!('webkitSpeechRecognition' in window) && !('SpeechRecognition' in window)) { alert("La reconnaissance vocale n'est pas prise en charge dans ce navigateur. Veuillez utiliser Google Chrome."); return; } const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; const recognition = new SpeechRecognition(); recognition.lang = 'fr-FR'; recognition.interimResults = false; recognition.maxAlternatives = 1; alert("🎙️ Écoute en cours... Parlez pour dicter vos notes de projet."); recognition.onresult = function(event) { const speechResult = event.results[0][0].transcript; const ta = document.getElementById("activeSectionText"); ta.value += (ta.value ? " " : "") + speechResult; handleSectionInput(); }; recognition.onerror = function(event) { alert("Une erreur s'est produite lors de la reconnaissance : " + event.error); }; recognition.start(); } function generateQrCode() { const link = document.getElementById("shareLinkInput").value; const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=${encodeURIComponent(link)}`; document.getElementById("qrImageElement").src = qrUrl; document.getElementById("qrContainer").style.display = "block"; } function runAiEvaluation() { const sci = Math.floor(80 + Math.random() * 15); const orig = Math.floor(75 + Math.random() * 20); const comm = Math.floor(85 + Math.random() * 14); document.getElementById("scoreScientific").textContent = `${sci}%`; document.getElementById("barScientific").style.width = `${sci}%`; document.getElementById("scoreOriginality").textContent = `${orig}%`; document.getElementById("barOriginality").style.width = `${orig}%`; document.getElementById("scoreCommunication").textContent = `${comm}%`; document.getElementById("barCommunication").style.width = `${comm}%`; alert("🤖 Évaluation de la grille YSC simulée avec succès !"); } function updatePermission() { const perm = document.getElementById("permissionToggle").value; alert(`Rôle d'accès au ProjectBoard mis à jour vers : ${perm.toUpperCase()}`); } function copyShareLink() { const input = document.getElementById("shareLinkInput"); input.select(); navigator.clipboard.writeText(input.value); alert("📋 Lien ProjectBoard partageable copié dans le presse-papiers !"); } function submitToTeacher() { const email = document.getElementById("teacherEmailInput").value; if (!email || !email.includes("@")) { alert("Veuillez entrer une adresse e-mail de professeur valide."); return; } alert(`🚀 Brouillon de projet soumis à ${email} pour révision !`); } function setTheme(color) { document.documentElement.style.setProperty('--primary-red', color); } let isDarkMode = false; function toggleDarkMode() { isDarkMode = !isDarkMode; if (isDarkMode) { document.documentElement.style.setProperty('--bg-body', '#0f172a'); document.documentElement.style.setProperty('--card-bg', '#1e293b'); document.documentElement.style.setProperty('--text-main', '#f8fafc'); document.documentElement.style.setProperty('--border-color', '#334155'); } else { document.documentElement.style.setProperty('--bg-body', '#f4f6f9'); document.documentElement.style.setProperty('--card-bg', '#ffffff'); document.documentElement.style.setProperty('--text-main', '#334155'); document.documentElement.style.setProperty('--border-color', '#e2e8f0'); } } let isHighContrast = false; function toggleHighContrast() { isHighContrast = !isHighContrast; if (isHighContrast) { document.documentElement.style.setProperty('--bg-body', '#000000'); document.documentElement.style.setProperty('--card-bg', '#000000'); document.documentElement.style.setProperty('--text-main', '#ffff00'); document.documentElement.style.setProperty('--border-color', '#ffff00'); document.documentElement.style.setProperty('--primary-red', '#ff0000'); } else { document.documentElement.style.setProperty('--bg-body', '#f4f6f9'); document.documentElement.style.setProperty('--card-bg', '#ffffff'); document.documentElement.style.setProperty('--text-main', '#334155'); document.documentElement.style.setProperty('--border-color', '#e2e8f0'); document.documentElement.style.setProperty('--primary-red', '#cc0000'); } } function checkAccessibility() { alert("🔎 Vérification A11y : Le contraste est suffisant. La taille de la police est lisible. Toutes les images ont des espaces réservés pour le texte alt. Tout est prêt !"); } let presentationTimer; let seconds = 0; function togglePresentationMode() { const body = document.body; body.classList.toggle('presentation-mode'); if(body.classList.contains('presentation-mode')) { alert("🎤 Mode Pratique activé. Appuyez sur ÉCHAP pour quitter."); seconds = 0; document.getElementById('practiceTimer').innerText = "00:00"; presentationTimer = setInterval(() => { seconds++; let m = Math.floor(seconds/60).toString().padStart(2, '0'); let s = (seconds % 60).toString().padStart(2, '0'); document.getElementById('practiceTimer').innerText = `${m}:${s}`; }, 1000); } else { clearInterval(presentationTimer); } } document.addEventListener('keydown', function(e) { if(e.key === "Escape" && document.body.classList.contains('presentation-mode')) { togglePresentationMode(); } }); function changeFontFamily() { const font = document.getElementById("fontSelect").value; document.documentElement.style.setProperty('--font-family', font); } function setBoardLayout(type) { document.querySelectorAll('.canvas-tab').forEach(t => t.classList.remove('active')); event.target.classList.add('active'); alert(`Basculé vers la mise en page du tableau : ${type.toUpperCase()}`); } function loadTemplate(type) { if (type === 'stem') { sectionData.why = "Étude de l'effet de la température sur la cinétique enzymatique."; sectionData.how = "Préparation de solutions de substrat sur 5 incréments de température de 10°C à 50°C."; } else { sectionData.why = "Conception d'un dispositif de filtration d'eau à faible coût pour les communautés éloignées."; sectionData.how = "Fabrication d'un prototype utilisant des couches de charbon actif, de sable et de gravier."; } switchSection(); saveToLocalStorage(); alert(`Modèle ${type.toUpperCase()} chargé dans l'éditeur !`); } function openEthicsModal() { document.getElementById('ethicsModal').style.display = 'flex'; } function closeEthicsModal() { document.getElementById('ethicsModal').style.display = 'none'; } function certifyEthics() { const c1 = document.getElementById('eth1').checked; const c2 = document.getElementById('eth2').checked; const c3 = document.getElementById('eth3').checked; if(c1 && c2 && c3) { ethicsCleared = true; document.getElementById('btnEthics').style.backgroundColor = 'var(--kid-green)'; document.getElementById('btnEthics').style.color = 'white'; document.getElementById('btnEthics').innerHTML = ' Éthique approuvée'; document.getElementById('btnDownload').disabled = false; document.getElementById('btnDownload').innerHTML = ' Télécharger le projet (.json)'; document.getElementById('btnDownload').title = "Exporter JSON"; closeEthicsModal(); alert("✅ Autorisation d'éthique approuvée ! Outils d'exportation déverrouillés."); } else { alert("Veuillez confirmer toutes les directives de sécurité et d'éthique pour continuer."); } } function loadProjectFile(event) { const file = event.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = function(e) { try { const parsed = JSON.parse(e.target.result); Object.assign(sectionData, parsed); switchSection(); saveToLocalStorage(); alert("📂 Fichier de projet chargé avec succès !"); } catch (err) { alert("Fichier de projet JSON invalide."); } }; reader.readAsText(file); } function downloadProjectFile() { if(!ethicsCleared) { alert("Vous devez passer la vérification d'éthique avant de télécharger."); return; } const exportData = { sectionData, sectionImages, sectionHeaderColors, logEntries }; const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(exportData, null, 2)); const dlAnchor = document.createElement('a'); dlAnchor.setAttribute("href", dataStr); dlAnchor.setAttribute("download", "qrstf_project_board_v3.2.json"); document.body.appendChild(dlAnchor); dlAnchor.click(); dlAnchor.remove(); } function exportPdfBoard() { if(!ethicsCleared) { alert("Vérification d'éthique requise."); return; } alert("📄 Génération du package d'exportation du tableau PDF formaté..."); } function syncGoogleSlides() { if(!ethicsCleared) { alert("Vérification d'éthique requise."); return; } alert("📊 Exportation des diapositives de présentation directement vers le modèle Google Slides..."); } function formatText(cmd) { const ta = document.getElementById("activeSectionText"); const start = ta.selectionStart; const end = ta.selectionEnd; const val = ta.value; const sel = val.substring(start, end); if (cmd === 'bold') { ta.value = val.substring(0, start) + `**${sel}**` + val.substring(end); } else if (cmd === 'italic') { ta.value = val.substring(0, start) + `*${sel}*` + val.substring(end); } handleSectionInput(); } function insertBullet() { const ta = document.getElementById("activeSectionText"); ta.value += "\n* "; handleSectionInput(); ta.focus(); } window.onload = function() { loadFromLocalStorage(); switchSection(); renderAnalytics(); initChart(); ['abstract', 'why', 'how', 'what', 'sowhat'].forEach(sec => { if(document.getElementById(`preview_${sec}`)) { const txt = sectionData[sec] || ""; document.getElementById(`preview_${sec}`).innerHTML = txt ? (txt.substring(0, 150) + (txt.length > 150 ? '...' : '')) : 'Contenu vide...'; } }); };